import pandas as pd

pd.set_option('display.unicode.east_asian.width', True)
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 100)
pd.set_option('display.width', 1000)

excel = pd.read_excel('resources/格式化数据.xlsx')
print(excel)

"""
1、设置小数位数
"""
print(excel.round(5))  # round中的参数可以是整数，对所有元素起作用 -- 保留5位小数

# 对指定列保留小数位置
print(excel.round({'A1': 1, 'A2': 2}))  # round中的参数可以是字典

s1 = pd.Series([0, 1, 2, 1, 2], index=['A1', 'A2', 'A3', 'A4', 'A5'])
print(s1)

print(excel.round(s1))  # round中的参数可以是Series

# 还可以使用自定义函数实现保留小数位置
e = excel.applymap(lambda x: '{:.2f}'.format(x))  # applymap调用每一个元素
print(e)
print('======================================\n')

"""
2、设置百分比
"""
excel = pd.read_excel('resources/格式化数据.xlsx')
print(excel)

# apply()函数，对A1设置百分比
excel['百分比'] = excel['A1'].apply(lambda x: format(x, '.0%'))
print(excel)

excel['百分比'] = excel['A1'].apply(lambda x: format(x, '.2%'))
print(excel)

# map()函数，对A1设置百分比
excel['百分比'] = excel['A1'].map(lambda x: format(x, '.1%'))
print(excel)

"""
3、设置千位分隔符
"""
excel = pd.read_excel('resources/msb课程记录.xls')
print(excel)

excel['买家实际支付金额'] = excel['买家实际支付金额'].apply(lambda x: format(int(x), ','))
print(excel)

"""
4、apply(), map(), applymap()区别 
    apply(): Series的每一个元素执行一次函数，DataFrame对一行或一列的元素执行一次函数
    map(): 只能对Series中每个元素产生作用
    applymap(): 将函数应用到DataFrame的每一个元素上
"""
# apply()
s = pd.Series(data=[10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print(s)
print(s.apply(lambda x: x + 10))

df = pd.DataFrame(data=[[10, 20, 30, 40], [11, 22, 33, 44]], index=['a', 'b'],
                  columns=['A', 'B', 'C', 'D'])
print(df)
print(df.apply(lambda x: x.sum(), axis=0))  # 列相加
print(df.apply(lambda x: x.sum(), axis=1))  # 行相加

# map():
df = pd.DataFrame(data=[['男'], ['女'], ['男'], ['男']], index=['张三', '李四', '王五', '陈六'], columns=['性别'])
print(df)


def gender(g):
    if g == '男':
        return 1
    else:
        return 0


# map() 参数可以是一个函数
print(type(df['性别']))  # <class 'pandas.core.series.Series'>
print(df['性别'].map(gender))

# map() 参数可以是字典
print(df['性别'].map({'男': 1, '女': 0}))

# applymap():
df = pd.DataFrame(data=[[10, 20, 30, 40], [11, 22, 33, 44]], index=['a', 'b'],
                  columns=['A', 'B', 'C', 'D'])
print(df.applymap(lambda x: x + 10))
